home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 5 / Gekikoh Dennoh Club Vol. 5 (Japan).7z / Gekikoh Dennoh Club Vol. 5 (Japan) (Track 01).bin / internet / webx / webcm011.lzh / WebCM.c < prev    next >
C/C++ Source or Header  |  1998-09-27  |  8KB  |  321 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <dirent.h>
  5. #include <sys/stat.h>
  6. #include <sys/xglob.h>
  7.  
  8. #include "WebCM.h"
  9. #include "WebCache/WebCache.h"
  10. #include "FuncUrl/FuncUrl.h"
  11.  
  12. /* ÆnêµÄ₧è╘é╔é╖éΘé╜é▀é╔ë┴ÄZé╖éΘÆl */
  13. #define TO_LOCALTIME    32400
  14.  
  15.  
  16. extern unsigned int cache_sum;    /* î╗ì▌âLâââbâVâàé╡é─éóéΘâtâ@âCâïÉö */
  17. extern unsigned int abs_max;    /* Cxxxxxxx é╠ì┼æσÆl */
  18. extern unsigned int abs_min;    /* Cxxxxxxx é╠ì┼żÆl */
  19. extern char cachedir[256];    /* è┬ï½ò╧Éö WEBCACHE */
  20. extern char cache_changed;    /* âLâââbâVâàé╠ôαùeé≡éPë±é┼éαò╧ìXé╡é╜é⌐üH */
  21.  
  22. /* URL é╞âeâôâ|âëâèâtâ@âCâïû╝é╠æ╬ë₧âeü[âuâï */
  23. typedef struct _temptable {
  24.     struct _temptable *next;/* ò╨ò√îⁿâèâXâg */
  25.     char hash;        /* ânâbâVâàÆl */
  26.     char type;        /* Content-Type */
  27.     unsigned int number;    /* âeâôâ|âëâèâtâ@âCâïû╝üié╠ÉöÆlòöüj */
  28.     unsigned int length;    /* âtâ@âCâïâTâCâY */
  29.     short year;        /* 0...32767 */
  30.     char mon;        /* 1...12 */
  31.     char day;        /* 1...31 */
  32.     char hour;        /* 0...23 */
  33.     char min;        /* 0...59 */
  34.     char sec;        /* 0...59 */
  35.     char access;        /* âAâNâZâXâtâëâO */
  36.     char url[0];        /* urlüiGCC é╔ê╦æ╢é╡é╜ò\ïLé┼éáéΘé▒é╞é╔Æìê╙üj */
  37. } TEMPTABLE;
  38.  
  39. static char *ext_type_str[]=
  40. {"HTM", "TXT", "DOC",
  41.  "GIF", "JPG", "PNG", "BMP",
  42.  "ZIP", "LZH", "TGZ",
  43.  "PDF",
  44.  "DAT", "DAT"};
  45.  
  46. char destdir[256];
  47.  
  48. unsigned int start_no = -1;
  49. unsigned int end_no = -1;
  50. int copy_flag = 0;
  51. int del_flag = 0;
  52. int justify_flag = 0;
  53. int renum_flag = 0;
  54. int renum = 0;
  55. extern TEMPTABLE *tt_top;
  56.  
  57. void usage (void)
  58. {
  59.     printf ("WebCacheManager WebCM.X ver0.11\n"
  60.         "        programmed by Mitsuky < FreeSoftware >\n"
  61.         "WebCache âtâ@âCâï(Cxxxxxxx.xxx)é╔æ╬é╡é─èeÄφæÇì∞é≡ìséóé▄é╖\n"
  62.         "Ägùpû@ : WebCM [option] [âfâBâîâNâgâèû╝]\n"
  63.         "[option]\n"
  64.         "-C[èJÄnâtâ@âCâïö╘ìå][,ÅIù╣âtâ@âCâïö╘ìå]\n"
  65.         "    WebCache âtâ@âCâïé≡î│é╠âtâ@âCâïû╝é╔ò£î│é╡é─âRâsü[é╡é▄é╖üB\n"
  66.         "-M[èJÄnâtâ@âCâïö╘ìå][,ÅIù╣âtâ@âCâïö╘ìå]\n"
  67.         "    WebCache âtâ@âCâïé≡î│é╠âtâ@âCâïû╝é╔ò£î│é╡é─ê┌ô«é╡é▄é╖üB\n"
  68.         "-D[èJÄnâtâ@âCâïö╘ìå][,ÅIù╣âtâ@âCâïö╘ìå]\n"
  69.         "    WebCache âtâ@âCâïé≡ìφÅ£é╡é▄é╖üB"
  70.         "-J[èJÄnâtâ@âCâïö╘ìå][,ÅIù╣âtâ@âCâïö╘ìå]\n"
  71.         "    WebCache âtâ@âCâïé╞ WebCache.env é╠É«ìçɽé≡é╞éΦé▄é╖üB\n"
  72.         "âfâBâîâNâgâèû╝ : -C / -M Ä₧é╠âRâsü[ɵâfâBâîâNâgâè\n"
  73.         "    û│ÄwÆΦÄ₧é═âJâîâôâgâfâBâîâNâgâè\n"
  74.         "    âfâBâîâNâgâèé¬û│éóÅΩìçé═Ä⌐ô«ôIé╔ì∞ɼé╡é▄é╖\n"
  75.         "è┬ï½ò╧Éö WEBCACHE é≡ÄQÅ╞é╡é▄é╖\n");
  76. }
  77.  
  78.  
  79. /* ì─ïAôIé╔âfâBâîâNâgâèé≡ì∞ɼé╖éΘ */
  80. /* *dirname = "C:/BIN/em/complete/" é╠éµéñé╔ÄwÆΦé╖éΘé╞ */
  81. /* êΩïCé╔éRèKæwé╠âfâBâîâNâgâèé≡ì∞éΦé▄é╖ */
  82. /* è∙é╔âfâBâîâNâgâèé¬æ╢ì▌é╡é╜ÅΩìçé═ë╜éαé╡é▄é╣é± */
  83. int RecursiveMkdir (char *dirname)
  84. {
  85.     char *p;
  86.     DIR *dirp;
  87.     char temp_str[256], temp_str2[256];
  88.  
  89.     _fullpath (temp_str, dirname, 256);
  90.     _addlastsep (temp_str);
  91.     _toslash (temp_str);
  92.     p = temp_str;
  93.     do {
  94.         while ((*p) && (*p++ != '/'));
  95.         strncpy (temp_str2, temp_str, p - temp_str);
  96.         *(temp_str2 + (p - temp_str)) = '\0';
  97.         if ((dirp = opendir (temp_str2)) != NULL) {
  98.             closedir (dirp);
  99.         } else {
  100.             printf ("mkdir %s\n", temp_str2);
  101.             if (mkdir (temp_str2, S_IEXEC | S_IWRITE | S_IREAD)) {
  102.                 printf ("âGâëü[ : %s é¬ì∞ɼé┼é½é▄é╣é±é┼é╡é╜\n");
  103.                 return (-1);
  104.             }
  105.         }
  106.     } while (*p);
  107.     return (0);
  108. }
  109.  
  110.  
  111.  
  112. int ExecMain (void)
  113. {
  114.     int cache_num = 0;
  115.     char source_fname[256], dest_fname[256];
  116.     FILE *fp;
  117.     char *content = NULL;
  118.     char scheme[256], hostname[256], path[256], fname[256], query[256], anchor[256];
  119.     int port;
  120.     TEMPTABLE *tt = tt_top, *tt_next;
  121.  
  122.     _addlastsep (destdir);
  123.     if (RecursiveMkdir (destdir) < 0) {
  124.         return (-1);
  125.     }
  126.     do {
  127.         tt_next = tt->next;
  128.         printf ("Åêù¥Æå %d/%d\x1b[0J\n\x0b", cache_num, cache_sum);
  129.         if ((tt->number >= start_no) && (tt->number <= end_no) && (!tt->access)) {
  130.             tt->access = !0;
  131.             UrlSplit (tt->url, scheme, hostname, path, fname, query, anchor, &port);
  132.             sprintf (source_fname, "%sC%07d.%s", cachedir, tt->number, ext_type_str[tt->type]);
  133.             sprintf (dest_fname, "%s%s", destdir, fname);
  134.  
  135.             printf ("        %s", source_fname);
  136.             if (copy_flag) {
  137.                 if ((fp = fopen (dest_fname, "rb")) != NULL) {
  138.                     printf (" -> %s : ô»û╝é╠âtâ@âCâïé¬æ╢ì▌é╡é▄é╖\n", dest_fname);
  139.                     fclose (fp);
  140.                     continue;
  141.                 }
  142.                 if ((fp = fopen (source_fname, "rb")) != NULL) {
  143.                     if ((content = malloc (tt->length)) != NULL) {
  144.                         fread (content, tt->length, sizeof (char), fp);
  145.                     } else {
  146.                         printf ("\n    âGâëü[ : âüâéâèé¬æ½éΦé▄é╣é±\n");
  147.                         content = NULL;
  148.                         continue;
  149.                     }
  150.                     fclose (fp);
  151.                     if ((fp = fopen (dest_fname, "wb")) != NULL) {
  152.                         struct tm t;
  153.                         struct utimbuf u;
  154.  
  155.                         fwrite (content, sizeof (char), tt->length, fp);
  156.                         fclose (fp);
  157.                         t.tm_year = tt->year - 1900;
  158.                         t.tm_mon = tt->mon - 1;
  159.                         t.tm_mday = tt->day;
  160.                         t.tm_hour = tt->hour;
  161.                         t.tm_min = tt->min;
  162.                         t.tm_sec = tt->sec;
  163.                         u.modtime = u.actime = mktime (&t) + TO_LOCALTIME;
  164.                         utime (dest_fname, &u);
  165.                         printf (" -> %s", dest_fname);
  166.                         if (!del_flag)
  167.                             printf (" : âRâsü[é╡é▄é╡é╜\n");
  168.                     } else {
  169.                         printf ("\n    %s : é▒é╠âtâ@âCâïû╝é┼é═Åæé½ì₧é▀é▄é╣é±\n", dest_fname);
  170.                         free (content);
  171.                         continue;
  172.                     }
  173.                 } else {
  174.                     printf (" é¬âIü[âvâôé┼é½é▄é╣é±\n", source_fname);
  175.                     free (content);
  176.                     continue;
  177.                 }
  178.             }
  179.             if (del_flag) {
  180.                 if (!remove (source_fname)) {
  181.                     WCDeleteUrl (tt->url);
  182.                     if (copy_flag)
  183.                         printf (" : ê┌ô«é╡é▄é╡é╜\n");
  184.                     else
  185.                         printf (" : ìφÅ£é╡é▄é╡é╜\n");
  186.                 } else {
  187.                     printf (" : ìφÅ£é┼é½é▄é╣é±é┼é╡é╜\n");
  188.                 }
  189.             }
  190.             if (justify_flag) {
  191.                 if ((fp = fopen (source_fname, "rb")) != NULL) {
  192.                     fclose (fp);
  193.                     printf (" : æ╢ì▌é╡é▄é╖\n");
  194.                 } else {
  195.                     WCDeleteUrl (tt->url);
  196.                     printf (" : WebCache.env é⌐éτìφÅ£é╡é▄é╡é╜\n");
  197.                 }
  198.             }
  199. #if 0
  200.             if (renum_flag) {
  201.                 tt->number += renum;
  202.                 sprintf (dest_fname, "%sC%07d.%s", cachedir, tt->number, ext_type_str[tt->type]);
  203.                 if (rename (source_fname, dest_fname) == 0) {
  204.                     printf (" : âèâiâôâoü[é╡é▄é╡é╜\n");
  205.                 } else {
  206.                     printf (" : âèâiâôâoü[é┼é½é▄é╣é±é┼é╡é╜\n");
  207.                 }
  208.             }
  209. #endif
  210.             if (content)
  211.                 free (content);
  212.         }
  213.         cache_num++;
  214.     } while ((tt = tt_next) != NULL);
  215.  
  216.     return (0);
  217. }
  218.  
  219.  
  220.  
  221. void GetNum (char *argv)
  222. {
  223.     switch ((char) (*(argv + 2))) {
  224.         case '\0':    /* -C é╠é▌ */
  225.         start_no = -1;
  226.         end_no = -1;
  227.         break;
  228.     case ',':        /* -C,ÅIù╣âtâ@âCâïö╘ìå */
  229.         start_no = -1;
  230.         sscanf (argv + 3, "%d", &end_no);
  231.         break;
  232.     default:        /* -CèJÄnâtâ@âCâïö╘ìå,ÅIù╣âtâ@âCâïö╘ìå */
  233.         sscanf (argv + 2, "%d,%d", &start_no, &end_no);
  234.         break;
  235.     }
  236. }
  237.  
  238.  
  239. int main (int argc, char *argv[])
  240. {
  241.     int i;
  242.     int slash_flag = 0;
  243.  
  244.     {
  245.         char *temp;
  246.  
  247.         temp = getenv ("SLASH");
  248.         if ((temp != NULL) && (*temp == '/')) {
  249.             slash_flag = 1;
  250.         }
  251.     }
  252.     strcpy (destdir, ".");
  253.  
  254.     for (i = 1; i < argc; i++) {
  255.         if (('-' == *argv[i]) || ((slash_flag == 0) && ('/' == *argv[i]))) {
  256.             switch (*(argv[i] + 1)) {
  257.  
  258.             case 'c':
  259.             case 'C':
  260.                 copy_flag = !0;
  261.                 del_flag = 0;
  262.                 GetNum (argv[i]);
  263.                 break;
  264.             case 'd':
  265.             case 'D':
  266.                 copy_flag = 0;
  267.                 del_flag = !0;
  268.                 GetNum (argv[i]);
  269.                 break;
  270.             case 'm':
  271.             case 'M':
  272.                 copy_flag = !0;
  273.                 del_flag = !0;
  274.                 GetNum (argv[i]);
  275.                 break;
  276.  
  277.             case 'j':
  278.             case 'J':
  279.                 justify_flag = !0;
  280.                 GetNum (argv[i]);
  281.                 break;
  282. #if    0
  283.             case 'r':
  284.             case 'R':
  285.                 renum_flag = !0;
  286.                 renum = atoi (argv[i] + 2);
  287.                 break;
  288. #endif
  289.             default:
  290.                 usage ();
  291.                 return (-1);
  292.             }
  293.         } else {
  294.             strcpy (destdir, argv[i]);
  295.         }
  296.     }
  297.  
  298.     if ((!copy_flag) && (!del_flag) && (!justify_flag) && (!renum_flag)) {
  299.         usage ();
  300.         return (-1);
  301.     }
  302.     WCInit ();
  303.     if (start_no == -1)
  304.         start_no = abs_min;
  305.     if (end_no == -1)
  306.         end_no = abs_max;
  307.  
  308.     if (!cache_sum) {
  309.         printf ("âLâââbâVâàâtâ@âCâïé¬éáéΦé▄é╣é±\n");
  310.         return (0);
  311.     }
  312.     printf ("C%07d é⌐éτ C%07d é≡Åêù¥é╡é▄é╖\n", start_no, end_no);
  313.     ExecMain ();
  314.     if (renum_flag)
  315.         cache_changed = !0;
  316.     if ((del_flag) || (justify_flag) || (renum_flag))
  317.         WCTini ();
  318.  
  319.     return (0);
  320. }
  321.